/*
 * meituan.com Inc.
 * Copyright (c) 2010-2018 All Rights Reserved.
 */
package item10;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

/**
 * <p>
 *
 * </p>
 * @author LvJing
 * @version $Id:JumpFloor.java v1.0 2018/7/14 下午6:17 LvJing Exp $
 */
public class JumpFloor {

    private Solution1 solution;

    @Before
    public void init() {
        solution = new Solution1();
    }

    /**
     * 特殊输入测试  -5
     */
    @Test
    public void test01() {
        Assert.assertEquals(-1, solution.JumpFloor(-5));
    }

    /**
     * 功能测试0，1，2，3，4，5项
     */
    @Test
    public void test02() {
        Assert.assertEquals(0, solution.JumpFloor(0));
        Assert.assertEquals(1, solution.JumpFloor(1));
        Assert.assertEquals(2, solution.JumpFloor(2));
        Assert.assertEquals(3, solution.JumpFloor(3));
        Assert.assertEquals(5, solution.JumpFloor(4));
        Assert.assertEquals(8, solution.JumpFloor(5));
    }
}

/**
 * 面试题10-2：青蛙跳台阶，青蛙每次可以调一级，也可以跳两级，问跳n级台阶，有多少种跳法。
 * 思路：一共1级台阶，只有1种跳法；一共2级台阶，有2种跳法（一次跳1级和一次跳2级）；跳n级台阶，拆分成，假设第一次跳1级，后面剩下的台阶就假设有f(n-1)
 * 种跳法，假设第一次跳2级，后面剩下的台阶就有f(n-2)种跳法，则除开第一次的两种跳法，后面还剩f(n-1)+f(n-2)种跳法，以此类推，这还是斐波那契数列。
 */
class Solution1 {

     int JumpFloor(int target) {
        if (target < 0) {
            return -1;
        }
        if (target <= 2) {
            return target;
        }

        int stepOne = 2;
        int stepTwo = 1;
        int result = 0;
        for (int i = 3; i <= target; i++) {
            result = stepOne + stepTwo;
            stepTwo = stepOne;
            stepOne = result;
        }
        return result;
    }
}
